extends Node2D
class_name InputManager

@export var map_layer:TileMapLayer
var player_chosen:Player


func mouse_shot() -> Array[Dictionary]:
	var spaceState: PhysicsDirectSpaceState2D = get_world_2d().direct_space_state
	var parameters = PhysicsPointQueryParameters2D.new()
	var mouse_position: Vector2 = get_global_mouse_position()  # 修正了拼写错误

	parameters.position = mouse_position
	parameters.collide_with_areas = true

	# 排除第2层（layer 2）的碰撞体
	# 假设默认掩码是全部检测（0xFFFFFFFF），这里移除第2层的检测
	parameters.collision_mask = 0xFFFFFFFF ^ (1 << 1)  # 使用位异或排除第2层

	return spaceState.intersect_point(parameters)


func get_mouse_cur_cell() -> Vector2i:
	var colliders: Array[Dictionary] = mouse_shot()
	if colliders.is_empty():
		return Vector2i(-1, -1) #无效cell
	var tile_colliders: Array = colliders.filter(func(c): return c.collider is TileMapLayer)
	if not tile_colliders.is_empty():
		return get_top_cell(tile_colliders)
	return Vector2i(-1, -1)
				
func get_top_cell(colliders) -> Vector2i:
	var tile_data_and_coords: Array[Dictionary] = []  # 存储 TileData 和坐标的字典数组
	
	for cur_collider in colliders:
		if cur_collider.collider is TileMapLayer:
			# 获取当前碰撞体的坐标
			var cur_cell: Vector2i = cur_collider.collider.get_coords_for_body_rid(cur_collider.rid)
			# 获取当前坐标的 TileData
			var cur_cell_data: TileData = cur_collider.collider.get_cell_tile_data(cur_cell)
			if cur_cell_data:
				# 存储 TileData 和坐标的关联
				tile_data_and_coords.append({
					"tile_data": cur_cell_data,
					"cell": cur_cell
				})
	
	if tile_data_and_coords.is_empty():
		return Vector2i(-1, -1)  # 返回无效坐标表示未命中
	
	# 按 y_offset 升序排序（数值小的优先级高）
	tile_data_and_coords.sort_custom(func(a, b): 
		return a["tile_data"].get_custom_data("y_offset") < b["tile_data"].get_custom_data("y_offset")
	)
	
	# 返回排序后第一个元素的坐标
	return tile_data_and_coords[0]["cell"]
